package com.github.od.util.jwt;

import org.joda.time.DateTime;

import com.github.od.constants.CommonConstants;
import com.github.od.util.KeyHelper;
import com.github.od.util.StringHelper;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

/**
 * JWT工具类
 * 
 * @author xieweikun
 * @version 2017年11月16日 下午2:59:30
 */
public class JWTHelper {

	/**
	 * 密钥加密Token
	 * 
	 * @param ijwtInfo
	 *            JWT信息接口
	 * @param priKeyPath
	 *            密钥文件路径
	 * @param expireTime
	 *            过期时间
	 * @return
	 * @throws Exception
	 */
	public static String generateToken(IJWTInfo ijwtInfo, String priKeyPath, int expireTime) throws Exception {
		String compactJws = Jwts.builder().setSubject(ijwtInfo.getUniqueName())
				.claim(CommonConstants.JWT_KEY_USER_ID, ijwtInfo.getId())
				.claim(CommonConstants.JWT_KEY_NAME, ijwtInfo.getName())
				.setExpiration(DateTime.now().plusSeconds(expireTime).toDate()) // 过期时间
				.signWith(SignatureAlgorithm.RS256, KeyHelper.getPrivateKey(priKeyPath)) // 编码类型
				.compact();
		return compactJws;
	}

	/**
	 * 公钥解析Token
	 * 
	 * @param token
	 *            token值
	 * @param pubKeyPath
	 *            公钥文件路径
	 * @return
	 * @throws Exception
	 */
	public static Jws<Claims> parserToken(String token, String pubKeyPath) throws Exception {
		Jws<Claims> jws = Jwts.parser().setSigningKey(KeyHelper.getPublicKey(pubKeyPath)).parseClaimsJws(token);
		return jws;
	}

	/**
	 * 封装parserToken方法，获取Token中的用户信息
	 * 
	 * @param token
	 *            token值
	 * @param pubKeyPath
	 *            公钥文件路径
	 * @return
	 * @throws Exception
	 */
	public static IJWTInfo getInfoFromToken(String token, String pubKeyPath) throws Exception {
		Jws<Claims> jws = parserToken(token, pubKeyPath);
		Claims body = jws.getBody();
		return new JWTInfo(StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_USER_ID)),body.getSubject(),
				StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_NAME)));
	}

}
